const { Readable } = require('stream')
const fs = require('fs')

// 创建一个自定义的可读流类
class CustomReadable extends Readable {
  // 构造函数，接收两个参数：highWaterMark和fileName
  constructor({ highWaterMark, fileName }) {
    // 调用父类的构造函数，传入highWaterMark参数
    super({ highWaterMark })
    // 保存fileName参数
    this.fileName = fileName
    // 初始化文件描述符
    this.fd = null
  }

  // 构造函数，打开文件
  _construct(callback) {
    // 使用fs.open打开文件，传入文件名和打开模式
    fs.open(this.fileName, 'r', (err, fd) => {
      // 如果打开文件出错，则调用回调函数并传入错误信息
      if (err) return callback(err)
      // 保存文件描述符
      this.fd = fd
      callback()
    })
  }

// 读取指定大小的数据
  _read(size) {
    // 创建一个指定大小的缓冲区
    const buffer = Buffer.alloc(size)
    // 从文件描述符中读取数据
    fs.read(this.fd, 0, size, null, (err, bytesRead) => {
      // 如果读取过程中发生错误，则销毁流
      if (err) return this.destroy(err)
      // 将读取到的数据推入流中
      this.push(bytesRead > 0 ? buffer.subarray(0, bytesRead) : null)
    })
  }

  // 销毁流
  _destroy(error, callback) {
    // 如果文件描述符存在，则关闭文件描述符
    if (this.fd) {
      fs.close(this.fd, (err) => callback(err || error))
    } else {
      // 如果文件描述符不存在，则直接调用回调函数
      callback(error)
    }
  }
}
